#ifndef RUNNABLE_H
#define RUNNABLE_H

#include <memory>

namespace base
{
class RunnableData;

/**
 * 线程池使用的任务，继承重写run()方法后加入线程池即可
 *
 * @author: haitao.lin
 */
class Runnable
{
public:
    explicit Runnable();
    explicit Runnable(const std::string &name);
    virtual ~Runnable();

    /**
     * 是否将对象的释放交于线程池管理
     */
    bool autoDelete() const;
    void setAutoDelete(bool autoDelete);

    /**
     * @brief:  设置/获取runnable名称，在开始运行前有效，运行后不可修改
     * @author: sherlock_lht
     */
    void setRunnableName(const std::string &name);
    std::string getRunnableName() const;

    /**
     * @brief   run()方法将会在线程中执行，需继承重写
     */
    virtual void run() = 0;
private:
    std::unique_ptr<RunnableData> data_;
};
}

#endif //RUNNABLE_H
